home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / util / boot / StartupSelectr.lha / StartupSelector105 / source / StartupSelector.e
Encoding:
Text File  |  1996-09-11  |  9.2 KB  |  346 lines

  1. /*     Startup  Selector     */
  2. /*   by OLIVERES Jean-Marc   */
  3. /* (c) 1996 Moonchild  Prod. */
  4. /*          07.09.96         */
  5.  
  6. OPT REG=3
  7.  
  8. MODULE 'dos/dos','dos/dostags','intuition/intuition','intuition/screens',
  9.        'gadtools','libraries/gadtools','reqtools','libraries/reqtools',
  10.        'exec/nodes','exec/lists','amigalib/lists'
  11.  
  12. ENUM ER_NONE,ER_WIN,ER_DIR,ER_NODIR,ER_LIB,ER_SCR,ER_MOUSE,ER_EXAM
  13. ENUM WBS=1,USER,LVID
  14.  
  15. RAISE ER_WIN   IF OpenWindowTagList()=NIL,
  16.             ER_LIB   IF OpenLibrary()=NIL,
  17.             ER_SCR   IF LockPubScreen()=NIL,
  18.             ER_MOUSE IF Mouse()<>1,
  19.             ER_EXAM  IF Examine()=NIL
  20.  
  21. CONST BIGGER=-1,SMALLER=1
  22. CONST G_HEIGHT=8
  23.  
  24. DEF ptrwin=NIL:PTR TO window,glist=NIL
  25. DEF scr=NIL:PTR TO screen,visual,menu
  26. DEF g_width,lv_height
  27. DEF fic_nbr=0,fic_lng,fic_pre,fic_fin,fic_user
  28. DEF info:fileinfoblock,dirscan,dirlock
  29. DEF ch[70]:STRING,count=0,count2=0
  30. DEF list=NIL:PTR TO lh
  31. DEF node=NIL:PTR TO ln
  32.  
  33. PROC main() HANDLE
  34.     DEF mes=NIL:PTR TO intuimessage
  35.     DEF id,gad:PTR TO gadget,i,userdata,idcmp,item
  36.     VOID '$VER:Startup Selector 1.05 (07.09.96) Moonchild Prod.'
  37.     AssignPath('ENV','RAM')
  38.     exceptioninfo:='gadtools.library'
  39.     gadtoolsbase:=OpenLibrary(exceptioninfo,37)
  40.     exceptioninfo:='reqtools.library'
  41.     reqtoolsbase:=OpenLibrary(exceptioninfo,37)
  42.     Rename('SYS:WBStartupOld','SYS:WBStartup')
  43.     Rename('SYS:WBStartupOld.info','SYS:WBStartup.info')
  44.     Rename('SYS:S/User-StartupOld','SYS:S/User-Startup')
  45.     choicerep()
  46.     Mouse()
  47.     scr:=LockPubScreen(NIL)
  48.     visual:=GetVisualInfoA(scr,NIL)
  49.     scanstartupdir()
  50.     largername()
  51.     addstartgadget()
  52.     window()
  53.     createmen()
  54.     REPEAT
  55.         IF mes:=Gt_GetIMsg(ptrwin.userport)
  56.             idcmp:=mes.class
  57.             SELECT idcmp
  58.             CASE IDCMP_MENUPICK
  59.                 item:=ItemAddress(menu,mes.code)
  60.                 IF item<>NIL
  61.                     id:=Long(item+34)
  62.                     IF id=1 THEN req('StartupSelector\n Version 1.05\n Copyright (c) 1996\n'+
  63.                                                      'Moonchild Prod.')
  64.                     IF id=2 THEN SystemTagList('NewCli',NIL)
  65.                     IF id=3
  66.                         Gt_ReplyIMsg(mes)
  67.                         IF scr THEN UnlockPubScreen(NIL,scr)
  68.                         IF ptrwin THEN CloseW(ptrwin)
  69.                         quit()
  70.                     ENDIF
  71.                 ENDIF
  72.             CASE IDCMP_GADGETUP
  73.                 gad:=mes.iaddress
  74.                 userdata:=gad.userdata
  75.                 SELECT userdata
  76.                 CASE WBS
  77.                      IF count=0 THEN count:=1 ELSE count:=0
  78.                 CASE USER
  79.                     IF count2=0 THEN count2:=1 ELSE count2:=0
  80.                 CASE LVID
  81.                     node:=list.head
  82.                     FOR i:=1 TO mes.code DO node:=node.succ 
  83.                     Gt_ReplyIMsg(mes)
  84.                     launchstart(node.name)
  85.                 ENDSELECT
  86.             ENDSELECT
  87.             Gt_ReplyIMsg(mes)
  88.         ELSE
  89.             WaitPort(ptrwin.userport)
  90.         ENDIF
  91.     UNTIL idcmp=IDCMP_CLOSEWINDOW
  92.     Raise(ER_MOUSE)
  93. EXCEPT
  94.     SELECT exception
  95.         CASE ER_WIN          ;    req('Unable to open window !')
  96.         CASE ER_DIR          ;    req('Can''t find your directory !')
  97.         CASE ER_NODIR      ;    req('Not a directory !')
  98.         CASE ER_SCR          ;    req('Unable to lock Workbench screen !')
  99.         CASE ER_EXAM      ;    req('Can''t acces directory or file !')
  100.         CASE ER_LIB
  101.             StrCopy(ch,'can''t open ')
  102.             StrAdd(ch,exceptioninfo)
  103.             req(ch)
  104.         CASE ER_MOUSE
  105.             StrCopy(ch,dirscan,ALL)
  106.             AddPart(ch,'Startup-Sequence',70)
  107.             IF (dirlock:=Lock(ch,ACCESS_READ))=NIL
  108.                 req('There is no Startup-Sequence file in the directory !\n' +
  109.                         'Press ''OK'' to load the Workbench so you can continue')
  110.                 SystemTagList('hd0:c/LoadWB',NIL)    
  111.                 quit()
  112.             ENDIF
  113.             launchstart('Startup-Sequence')
  114.     ENDSELECT
  115.     quit()
  116. ENDPROC
  117.  
  118. PROC req(msg)
  119.     RtEZRequestA(msg,'OK',0,0,[RTEZ_FLAGS ,EZREQF_CENTERTEXT,
  120.                                                      RT_REQPOS  ,REQPOS_CENTERSCR,
  121.                                                          NIL])
  122. ENDPROC
  123.  
  124. PROC choicerep()
  125.     DEF myargs:PTR TO LONG,rdargs
  126.      myargs:=[0]
  127.      rdargs:=ReadArgs('PATH/O',myargs,NIL)
  128.     IF myargs[]=0
  129.         dirscan:='SYS:S/start/'
  130.     ELSE
  131.         dirscan:=String(StrLen(myargs[0]))
  132.         StrCopy(dirscan,myargs[0])
  133.     ENDIF
  134.     IF rdargs THEN FreeArgs(rdargs)
  135. ENDPROC
  136.  
  137. PROC scanstartupdir()
  138.     IF (dirlock:=Lock(dirscan,ACCESS_READ))=NIL THEN Raise(ER_NODIR)
  139.     Examine(dirlock,info)
  140.     IF info.direntrytype <= 0 THEN Raise(ER_NODIR)
  141.         WHILE ExNext(dirlock,info)
  142.             INC fic_nbr
  143.             getstartupname(info.filename)
  144.         ENDWHILE
  145.     IF fic_nbr=0 THEN nofile()
  146. ENDPROC
  147.  
  148. PROC nofile()
  149.     req('HEY !!! Why do you run me if there''s no script in the directory !\n' +
  150.             'Press ''OK'' to load the Workbench so you can continue')
  151.     SystemTagList('hd0:c/LoadWB',NIL)    
  152.     quit()
  153. ENDPROC
  154.  
  155. PROC getstartupname(infofilename)
  156.     DEF fic_chaine,length,var,var2
  157.     DEF fic_chaineUp[30]:STRING,fic_preUp[30]:STRING,fic_finUp[30]:STRING
  158.     length:=StrLen(infofilename)
  159.     fic_chaine:=String(length)
  160.     StrCopy(fic_chaine,infofilename)
  161.  
  162.     StrCopy(fic_chaineUp,fic_chaine)
  163.     UpperStr(fic_chaineUp)
  164.     IF fic_pre
  165.         StrCopy(fic_preUp,fic_pre)
  166.         UpperStr(fic_preUp)
  167.         StrCopy(fic_finUp,fic_fin)
  168.         UpperStr(fic_finUp)
  169.     ENDIF
  170.  
  171.     IF fic_nbr=1
  172.         fic_pre:=fic_chaine
  173.     ELSEIF OstrCmp(fic_preUp,fic_chaineUp)=BIGGER
  174.         Link(fic_chaine,fic_pre)
  175.         fic_pre:=fic_chaine
  176.         RETURN
  177.     ELSEIF OstrCmp(fic_finUp,fic_chaineUp)=SMALLER
  178.         Link(fic_fin,fic_chaine)
  179.     ELSE
  180.         var:=fic_pre
  181.         var2:=Next(fic_pre)
  182.         WHILE var2<>NIL
  183.  
  184.             StrCopy(fic_finUp,var2)
  185.             UpperStr(fic_finUp)
  186.  
  187.             IF OstrCmp(fic_finUp,fic_chaineUp)=BIGGER
  188.                 Link(fic_chaine,var2)
  189.                 Link(var,fic_chaine)
  190.                 
  191.                 RETURN
  192.             ENDIF
  193.             var:=Next(var)
  194.             var2:=Next(var2)
  195.         ENDWHILE
  196.     ENDIF
  197.     fic_fin:=fic_chaine
  198. ENDPROC
  199.  
  200. PROC largername()
  201.     DEF max=0,len
  202.     fic_user:=fic_pre
  203.     WHILE (fic_user:=Next(fic_user))<>NIL
  204.         len:=StrLen(fic_user)
  205.         IF len>max THEN max:=len
  206.     ENDWHILE
  207.     fic_lng:=max
  208. ENDPROC
  209.  
  210. PROC addstartgadget()
  211.     DEF gadget,posy,tmp
  212.     NEW list
  213.     newList(list)
  214.     gadget:=CreateContext({glist})
  215.     posy:=0
  216.     g_width:=fic_lng*8+8
  217.     tmp:=fic_nbr
  218.     IF tmp<8
  219.         lv_height:=8*G_HEIGHT+4
  220.     ELSEIF tmp>29
  221.         lv_height:=29*G_HEIGHT+4
  222.     ELSE
  223.         lv_height:=tmp*G_HEIGHT+4
  224.     ENDIF
  225.     filllist()
  226.     gadget:=CreateGadgetA(LISTVIEW_KIND,gadget,
  227.                     [0,posy,g_width+20,lv_height,0,0,0,0,visual,LVID]:newgadget,
  228.                     [GTLV_LABELS,list,
  229.                     GTLV_SELECTED,TRUE,
  230.                     0])
  231.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  232.                     [g_width+22,0,12,12,0,0,0,0,visual,USER]:newgadget,NIL)
  233.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  234.           [g_width+22,12,12,12,0,0,0,0,visual,WBS]:newgadget,NIL)
  235. ENDPROC
  236.  
  237. PROC filllist()
  238.   NEW node
  239.     fic_user:=fic_pre
  240.     node.name:=String(StrLen(fic_user))    
  241.     StrCopy(node.name,fic_user,ALL)
  242.     AddHead(list,node)
  243.     WHILE (fic_user:=Next(fic_user))<>NIL
  244.         NEW node
  245.         node.name:=String(StrLen(fic_user))    
  246.         StrCopy(node.name,fic_user,ALL)
  247.         AddTail(list,node)
  248.     ENDWHILE
  249. ENDPROC
  250.  
  251. PROC window()
  252.     DEF widcmp,wflags,wport,rport,beveltags
  253.     DEF w_width,w_left,w_top
  254.     w_width:=g_width+213+20
  255.     w_left:=(scr.width-w_width)/2
  256.     w_top:=(scr.height-lv_height)/2
  257.     beveltags:=[GT_VISUALINFO,visual,GTBB_FRAMETYPE,BBFT_BUTTON,NIL]
  258.     widcmp:=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_MENUPICK OR LISTVIEWIDCMP
  259.     wflags:=WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_GIMMEZEROZERO+WFLG_NEWLOOKMENUS
  260.     ptrwin:=OpenWindowTagList(NIL,[WA_TITLE        ,'Startup-Selector 1.05',
  261.                                  WA_GADGETS      ,glist,
  262.                                  WA_LEFT         ,w_left,
  263.                                  WA_TOP          ,w_top,
  264.                                  WA_INNERWIDTH   ,w_width,
  265.                                  WA_INNERHEIGHT  ,lv_height,
  266.                                  WA_IDCMP        ,widcmp,
  267.                                  WA_FLAGS        ,wflags,
  268.                                                                  WA_AUTOADJUST   ,-1,
  269.                                  WA_ACTIVATE     ,-1,
  270.                                  NIL])
  271.     Gt_RefreshWindow(ptrwin,NIL)
  272.     wport:=SetStdRast(ptrwin.rport)
  273.     rport:=ptrwin.rport
  274.     TextF(g_width+32+20,8,'Disable User-Startup ?')
  275.     TextF(g_width+32+20,20,'Disable WBStartup ?')
  276.     DrawBevelBoxA(rport,g_width+29+20,0,184,11,beveltags)
  277.     DrawBevelBoxA(rport,g_width+29+20,12,160,11,beveltags)
  278. ENDPROC
  279.  
  280. PROC createmen()
  281.   menu:=CreateMenusA([1,0,'Projet',0,0,0,0,
  282.                       2,0,'About',0,0,0,1,
  283.                                             2,0,NM_BARLABEL,0,0,0,0,
  284.                                             2,0,'NewCli',0,0,0,2,
  285.                                             2,0,NM_BARLABEL,0,0,0,0,
  286.                                             2,0,'Quit',0,0,0,3,
  287.                       0,0,0,0,0,0,0]:newmenu,[GTMN_FRONTPEN,1,
  288.                                                                                             GTMN_NEWLOOKMENUS,TRUE,
  289.                                                                                             NIL])
  290.   LayoutMenusA(menu,visual,NIL)
  291.   SetMenuStrip(ptrwin,menu)
  292. ENDPROC
  293.  
  294. PROC launchstart(file)
  295.     DEF launch
  296.     IF count=1
  297.         IF (Rename('SYS:WBStartup','SYS:WBStartupOld'))=NIL
  298.             req('Can''t rename WBStartup !\n Name is not ''WBStartupOld''...')
  299.             RETURN
  300.         ELSEIF (Rename('SYS:WBStartup.info','SYS:WBStartupOld.info'))=NIL
  301.             req('Can''t rename WBStartup.info !\n Name is not ''WBStartupOld.info''...')
  302.             RETURN
  303.         ENDIF
  304.     ENDIF
  305.     IF count2=1
  306.         IF (Rename('SYS:S/User-Startup','SYS:S/User-StartupOld'))=NIL
  307.             req('Can''t rename User-Startup !\n Name is not ''User-StartupOld''...')
  308.             RETURN
  309.         ENDIF
  310.     ENDIF
  311.     StrCopy(ch,dirscan,ALL)
  312.     AddPart(ch,file,70)
  313.     setscriptattr(ch)
  314.     IF scr THEN UnlockPubScreen(NIL,scr)
  315.     IF ptrwin THEN CloseW(ptrwin)
  316.     IF (launch:=SystemTagList(ch,NIL))=TRUE
  317.         req('Can''t execute this script !\n Please try another one ...')
  318.         RETURN
  319.     ENDIF
  320.     quit()
  321. ENDPROC
  322.  
  323. PROC setscriptattr(file)
  324.     DEF fh,fib:PTR TO fileinfoblock,mask
  325.     IF FileLength(file)>-1
  326.         fh:=Open(file,OLDFILE)
  327.         NEW fib
  328.         ExamineFH(fh, fib)
  329.         mask:=fib.protection
  330.         Close(fh)
  331.         mask:=mask OR FIBF_SCRIPT
  332.         SetProtection(file,mask)
  333.     ENDIF
  334. ENDPROC
  335.  
  336. PROC quit()
  337.     IF menu THEN FreeMenus(menu)
  338.     IF ptrwin THEN ClearMenuStrip(ptrwin)
  339.     IF visual THEN FreeVisualInfo(visual)
  340.     IF dirlock THEN UnLock(dirlock)
  341.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  342.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  343.     OpenWorkBench()
  344.     CleanUp(0)
  345. ENDPROC
  346.